﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

namespace Infrastructure.Helper
{
    /// <summary>
    /// 提供读取应用程序配置文件（如 appsettings.json）和连接字符串的功能。
    /// </summary>
    public class ConfigUtils
    {
        /// <summary>
        /// 获取 ConfigUtils 的单例实例。
        /// </summary>
        public static ConfigUtils Instance { get; private set; }

        /// <summary>
        /// 用于访问配置的 IConfiguration 实例。
        /// </summary>
        private static IConfiguration Config { get; set; }

        /// <summary>
        /// 静态构造函数，初始化配置并创建单例实例。
        /// </summary>
        static ConfigUtils()
        {
            // 从服务提供者中获取配置实例
            Config = App.ServiceProvider.GetRequiredService<IConfiguration>();

            // 如果单例尚未创建，则创建单例实例
            if (Instance == null)
            {
                Instance = new ConfigUtils();
            }
        }

        /// <summary>
        /// 获取应用程序配置文件中指定键的值，并转换为指定类型。如果键不存在，则返回默认值。
        /// </summary>
        /// <typeparam name="T">值的类型</typeparam>
        /// <param name="key">配置键</param>
        /// <param name="defaultValue">默认值，如果配置中没有找到对应键时返回此值。</param>
        /// <returns>指定键的值，类型为 T；如果键不存在，则返回默认值。</returns>
        public T GetAppConfig<T>(string key, T defaultValue = default(T))
        {
            // 获取配置值并转换为 T 类型
            T val = (T)Convert.ChangeType(Config[key], typeof(T));
            T result = val;

            // 如果值为空，则返回默认值
            if (val == null)
            {
                result = defaultValue;
            }
            return result;
        }

        /// <summary>
        /// 获取应用程序配置文件中指定键的字符串值。
        /// </summary>
        /// <param name="key">配置键</param>
        /// <returns>指定键的字符串值。</returns>
        public string GetConfig(string key)
        {
            return Config[key];
        }

        /// <summary>
        /// 获取指定连接字符串的值。
        /// </summary>
        /// <param name="key">连接字符串的键</param>
        /// <returns>指定连接字符串的值。</returns>
        public string GetConnectionStrings(string key)
        {
            return Config.GetConnectionString(key);
        }
    }
}
